/**************基于51单片机的数字音乐盒***********/

#include <REGX52.H>		//51单片机头文件  REGX52.H比 reg52.h的宏定义多一些！
#include "Tim.h"		//定时器的头文件
#include "Delay.h"		//延时函数
#include "oled.h"
//#include "LCD1602.h"	//LCD1602液晶屏头文件
#include "Music.h"



/******变量-标志位******/
unsigned char Music_Mode = 0;			//模式--- 0 暂停(停止)，123分别代表第123首歌曲
unsigned char Music_Mode_Select;		//模式选择按键
unsigned char FreqSelect,MusicSelect;



/*******函数声明*******/
void Key_Scan(void);					//按键扫描函数
void Select_MusicMode_Function(void);	//选择音乐模式函数


void main()
{
	Timer0_Init();	//初始化默认停止计时，TR0 = 0;
	OLED_Init();
	OLED_ShowString(0,0,"Music", 5);
//	LCD_Init();		
	//开机动画
//	LCD_ShowString(1,1,"Welcome");	//第一行第一列显示ABC
//	LCD_ShowString(2,1,"Music OFF");	//开机默认显示 Music OFF
	while(1)
	{
		Key_Scan();
		Select_MusicMode_Function();
	}
}



/*******定时器0的中断服务子函数*******/
void Timer0_Routine() interrupt 1  
{
	//1ms进一次，2ms一周期，频率f=500Hz
	if(FreqTable[FreqSelect])	//如果不是休止符
	{
		TL0 = FreqTable[FreqSelect]%256;		//设置定时初值
		TH0 = FreqTable[FreqSelect]/256;		//设置定时初值
		Buzzer=!Buzzer;//翻转蜂鸣器IO口
	}

}

/**********************函数部分**********************/
void Key_Scan(void)	//按键扫描函数
{
	if (0 == KEY1) 	{Music_Mode_Select = 1;MusicSelect = 0; }	//按键1按下，选择模式0，MusicSelect乐谱索引清零，LCD提示 Music 1    LCD_ShowString(2,1,"Music 1  ");
	if (0 == KEY2) 	{Music_Mode_Select = 2;MusicSelect = 0; }	//LCD_ShowString(2,1,"Music 2  ");
	if (0 == KEY3) 	{Music_Mode_Select = 3;MusicSelect = 0; }	//LCD_ShowString(2,1,"Music 3  ");
	if (0 == KEY4)	//按键4开始播放所选择的乐曲
	{
		Music_Mode = Music_Mode_Select;	//将当前选择的模式赋值给Music_Mode变量
		TR0 = 1;	//音乐开启
	}
	if (0 == KEY5)	//如果按键5按下，暂停功能
	{	Music_Mode = 0;		}
}

void Select_MusicMode_Function(void)
{
	if (0 == Music_Mode)
	{
		TR0 = 0;	//暂停计时
		
	}		
	if (1 == Music_Mode)	//模式1 --- 歌曲1 --- 《花海》
	{
		// LCD_ShowString(2,1,"Music 1  ");
		if(Music_HuaHai[MusicSelect]!=0xFF)//如果不是停止标志位
		{
			FreqSelect = Music_HuaHai[MusicSelect];//选择音符对应的频率
			MusicSelect++;
			Delay((SPEED/4)*Music_HuaHai[MusicSelect]);//十六分音符是125ms，选择音符对应的时值
			MusicSelect++;
			TR0=0;
			Delay(5);	//音符间短暂停顿
			TR0=1;
		}
		else	//如果是停止标志位
		{
			Music_Mode = 0;		//清零Music_Mode变量，改变成模式0，代表暂停（停止）
//				TR0=0;
//				while(1);//播放完死循环
		}
	}
		
	if (2 == Music_Mode)	//模式2 --- 歌曲2 --- 《天空之城》
	{
		// LCD_ShowString(2,1,"Music 2  ");
		if(Music_Castle_in_the_Sky[MusicSelect]!=0xFF)//如果不是停止标志位
		{
			FreqSelect = Music_Castle_in_the_Sky[MusicSelect];//选择音符对应的频率
			MusicSelect++;
			Delay((SPEED/4)*Music_Castle_in_the_Sky[MusicSelect]);//十六分音符是125ms，选择音符对应的时值
			MusicSelect++;
			TR0=0;
			Delay(5);	//音符间短暂停顿
			TR0=1;
		}
		else	//如果是停止标志位
		{
			Music_Mode = 0;
		}
	}
		
	if (3 == Music_Mode)	//模式3 --- 歌曲3 --- 《勇气大爆发》
	{
		// LCD_ShowString(2,1,"Music 3  ");
		if(Music_3[MusicSelect]!=0xFF)				//如果不是停止标志位
		{
			FreqSelect = Music_3[MusicSelect];		//选择音符对应的频率
			MusicSelect++;
			Delay((SPEED/4)*Music_3[MusicSelect]);	//十六分音符是125ms，选择音符对应的时值
			MusicSelect++;
			TR0=0;
			Delay(5);	//音符间短暂停顿
			TR0=1;
		}
		else	//如果是停止标志位
		{
			Music_Mode = 0;
		}
	}
}




